﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using LogicaNegocio;
using Entities;
using AccesoDatos;

namespace Presentacion
{
    public partial class ConsultarProductos : System.Web.UI.Page
    {
        private static string op;
        private GestorMarcas gMarcas;
        private GestorProductos gp;
        private GestorCategorias gCategorias;
        private GestorUnidadesMedida gUnidades;
        private static bool esFiltrada = false;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Page.Title = "Consultar Productos";
                cargarGrillaProductos();
                op = Request.QueryString["op"].ToString();
                if (!Page.User.IsInRole("Admin") && !Page.User.IsInRole("Usuario") && !Page.User.IsInRole("SuperUser"))
                {
                    if (op != "cons")
                        Response.Redirect("~/AccesoNoAutorizado.aspx");
                    else
                    grdProductos.Enabled = false;
                }
            }
            Page.Title = "Consultar Productos";
        }

        private void cargarGrillaProductos()
        {
            try
            {
                esFiltrada = false;
                grdProductos.DataSource = null;
                gp = new GestorProductos();
                gMarcas = new GestorMarcas();
                gCategorias = new GestorCategorias();
                gUnidades = new GestorUnidadesMedida();
                List<Producto> lstProductos = new List<Producto>();
                lstProductos = gp.ObtenerTodos();
                if (lstProductos != null)
                {
                    foreach (Producto p in lstProductos)
                    {
                        p.NombreMarca = gMarcas.BuscarPorId(p.IdMarca).Nombre;
                        p.NombreCategoria = gCategorias.BuscarPorId(p.IdCategoria).Nombre;
                        p.NombreUnidadMedida = gUnidades.BuscarPorId(p.IdUnidadMedida).Nombre;
                    }
                    grdProductos.DataSource = lstProductos;
                    string[] claves = { "idProducto" };
                    grdProductos.DataKeyNames = claves;
                    grdProductos.DataBind();
                }
                else
                {
                    grdProductos.DataSource = null;
                    grdProductos.DataBind();
                    lblError.Text = "La lista de productos no estaba llena";
                }
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;
            } 
        }

        private void cargarGrillaProductosFiltrada()
        {
            try
            {
                esFiltrada = true;
                int? idProd = null;
                string nombreProd = null;

                if (!String.IsNullOrEmpty(txtIdProducto.Text))
                    idProd = Convert.ToInt32(txtIdProducto.Text);
                if (!String.IsNullOrEmpty(txtNombreProducto.Text))
                    nombreProd = txtNombreProducto.Text;

                gp = new GestorProductos();
                gMarcas = new GestorMarcas();
                gCategorias = new GestorCategorias();
                gUnidades = new GestorUnidadesMedida();
                List<Producto> lstProductos = gp.ObtenerTodos(nombreProd, idProd);
                if (lstProductos != null)
                {
                    foreach (Producto p in lstProductos)
                    {
                        p.Nombre = gMarcas.BuscarPorId(p.IdMarca).Nombre;
                        p.NombreCategoria = gCategorias.BuscarPorId(p.IdCategoria).Nombre;
                        p.NombreUnidadMedida = gUnidades.BuscarPorId(p.IdUnidadMedida).Nombre;
                    }
                    grdProductos.DataSource = lstProductos;
                    string[] claves = { "idProducto" };
                    grdProductos.DataKeyNames = claves;
                    grdProductos.DataBind();
                }
                else
                {
                    grdProductos.DataSource = null;
                    grdProductos.DataBind();
                    lblError.Text = "La lista de productos no estaba llena";
                }
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;
            }
            //int? idProd = null;
            //string nombreProd = null;

            //if (!String.IsNullOrEmpty(txtIdProducto.Text))
            //    idProd = Convert.ToInt32(txtIdProducto.Text);
            //if (!String.IsNullOrEmpty(txtNombreProducto.Text))
            //    nombreProd = txtNombreProducto.Text;

            //gp = new GestorProductos();
            //gMarcas = new GestorMarcas();
            //gCategorias = new GestorCategorias();
            //gUnidades = new GestorUnidadesMedida();
            //List<Producto> lstProductos = gp.ObtenerTodos(nombreProd, idProd);
            //if (lstProductos != null)
            //{
            //    foreach (Producto p in lstProductos)
            //    {
            //        p.Nombre = gMarcas.BuscarPorId(p.IdMarca).Nombre;
            //        p.NombreCategoria = gCategorias.BuscarPorId(p.IdCategoria).Nombre;
            //        p.NombreUnidadMedida = gUnidades.BuscarPorId(p.IdUnidadMedida).Nombre;
            //    }
            //    grdProductos.DataSource = lstProductos;
            //    string[] claves = { "idProducto" };
            //    grdProductos.DataKeyNames = claves;
            //    grdProductos.DataBind();
            //}
            //else
            //{
            //    grdProductos.DataSource = null;
            //    grdProductos.DataBind();
            //    lblError.Text = "La lista de productos no estaba llena";
            //}
        }

        protected void btnFiltrar_Click(object sender, EventArgs e)
        {
            cargarGrillaProductosFiltrada();
        }

        protected void grdProductos_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                int idProd = (int)grdProductos.SelectedDataKey[0];
                op = Request.QueryString["op"].ToString();
                if (op.Equals("buscar"))
                {
                    gp = new GestorProductos();
                    gMarcas = new GestorMarcas();
                    gCategorias = new GestorCategorias();
                    gUnidades = new GestorUnidadesMedida();
                    Producto producto = gp.BuscarPorId(idProd);
                    if (producto != null)
                    {
                        producto.Nombre = gMarcas.BuscarPorId(producto.IdMarca).Nombre;
                        producto.NombreCategoria = gCategorias.BuscarPorId(producto.IdCategoria).Nombre;
                        producto.NombreUnidadMedida = gUnidades.BuscarPorId(producto.IdUnidadMedida).Nombre;
                        Session["ProdSelect"] = producto;
                        Response.Redirect("~/Ventas/Ventas.aspx");
                    }
                }
                else
                    Response.Redirect("ABMProductos.aspx?idProducto=" + idProd + "&op=" + op);
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;
            }
            //int idProd = (int)grdProductos.SelectedDataKey[0];
            //op = Request.QueryString["op"].ToString();
            //if (op.Equals("buscar"))
            //{
            //    gp = new GestorProductos();
            //    gMarcas = new GestorMarcas();
            //    gCategorias = new GestorCategorias();
            //    gUnidades = new GestorUnidadesMedida();
            //    Producto producto = gp.BuscarPorId(idProd);
            //    if(producto != null)
            //    {
            //        producto.Nombre = gMarcas.BuscarPorId(producto.IdMarca).Nombre;
            //        producto.NombreCategoria = gCategorias.BuscarPorId(producto.IdCategoria).Nombre;
            //        producto.NombreUnidadMedida = gUnidades.BuscarPorId(producto.IdUnidadMedida).Nombre;
            //        Session["ProdSelect"] = producto;
            //        Response.Redirect("~/Ventas/Ventas.aspx");
            //    }
            //}
            //else
            //    Response.Redirect("ABMProductos.aspx?idProducto=" + idProd + "&op=" + op);
        }

        protected void grdProductos_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grdProductos.PageIndex = e.NewPageIndex;
            if (esFiltrada)
                cargarGrillaProductosFiltrada();
            else
                cargarGrillaProductos();

        }

        protected void grdProductos_Sorting(object sender, GridViewSortEventArgs e)
        {
            ViewState["Orden"] = e.SortExpression;
            if (ViewState["Direccion"] != null)
            {
                if (ViewState["Direccion"].ToString() == "DESC")
                    ViewState["Direccion"] = "ASC";
                else
                    ViewState["Direccion"] = "DESC";
            }
            else if (e.SortDirection.ToString() == "Ascending")
            {
                ViewState["Direccion"] = "ASC";
            }
            //ViewState["Direccion"] = e.SortDirection;
            if (esFiltrada)
                cargarGrillaProductosFiltradaSort();
            else
                cargarGrillaProductosOrdenados();
        }
        private void cargarGrillaProductosFiltradaSort()
        {
            try
            {
                esFiltrada = true;
                int? idProd = null;
                string nombreProd = null;

                if (!String.IsNullOrEmpty(txtIdProducto.Text))
                    idProd = Convert.ToInt32(txtIdProducto.Text);
                if (!String.IsNullOrEmpty(txtNombreProducto.Text))
                    nombreProd = txtNombreProducto.Text;

                gp = new GestorProductos();
                gMarcas = new GestorMarcas();
                gCategorias = new GestorCategorias();
                gUnidades = new GestorUnidadesMedida();
                List<Producto> lstProductos = gp.ObtenerTodosSort(nombreProd, idProd, ViewState["Orden"].ToString(), ViewState["Direccion"].ToString());
                if (lstProductos != null)
                {
                    foreach (Producto p in lstProductos)
                    {
                        p.Nombre = gMarcas.BuscarPorId(p.IdMarca).Nombre;;
                        p.NombreCategoria = gCategorias.BuscarPorId(p.IdCategoria).Nombre;
                        p.NombreUnidadMedida = gUnidades.BuscarPorId(p.IdUnidadMedida).Nombre;
                    }
                    grdProductos.DataSource = lstProductos;
                    string[] claves = { "idProducto" };
                    grdProductos.DataKeyNames = claves;
                    grdProductos.DataBind();
                }
                else
                {
                    grdProductos.DataSource = null;
                    grdProductos.DataBind();
                    lblError.Text = "La lista de productos no estaba llena";
                }
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;
            }
            //int? idProd = null;
            //string nombreProd = null;

            //if (!String.IsNullOrEmpty(txtIdProducto.Text))
            //    idProd = Convert.ToInt32(txtIdProducto.Text);
            //if (!String.IsNullOrEmpty(txtNombreProducto.Text))
            //    nombreProd = txtNombreProducto.Text;

            //gp = new GestorProductos();
            //gMarcas = new GestorMarcas();
            //gCategorias = new GestorCategorias();
            //gUnidades = new GestorUnidadesMedida();
            //List<Producto> lstProductos = gp.ObtenerTodos(nombreProd, idProd);
            //if (lstProductos != null)
            //{
            //    foreach (Producto p in lstProductos)
            //    {
            //        p.Nombre = gMarcas.BuscarPorId(p.IdMarca).Nombre;
            //        p.NombreCategoria = gCategorias.BuscarPorId(p.IdCategoria).Nombre;
            //        p.NombreUnidadMedida = gUnidades.BuscarPorId(p.IdUnidadMedida).Nombre;
            //    }
            //    grdProductos.DataSource = lstProductos;
            //    string[] claves = { "idProducto" };
            //    grdProductos.DataKeyNames = claves;
            //    grdProductos.DataBind();
            //}
            //else
            //{
            //    grdProductos.DataSource = null;
            //    grdProductos.DataBind();
            //    lblError.Text = "La lista de productos no estaba llena";
            //}
        }
        private void cargarGrillaProductosOrdenados()
        {
            try
            {
                esFiltrada = false;
                grdProductos.DataSource = null;
                gp = new GestorProductos();
                gMarcas = new GestorMarcas();
                gCategorias = new GestorCategorias();
                gUnidades = new GestorUnidadesMedida();
                List<Producto> lstProductos = new List<Producto>();
                lstProductos = gp.ObtenerTodosOrdenados(ViewState["Orden"].ToString(), ViewState["Direccion"].ToString());
                if (lstProductos != null)
                {
                    foreach (Producto p in lstProductos)
                    {
                        p.NombreMarca = gMarcas.BuscarPorId(p.IdMarca).Nombre;
                        p.NombreCategoria = gCategorias.BuscarPorId(p.IdCategoria).Nombre;
                        p.NombreUnidadMedida = gUnidades.BuscarPorId(p.IdUnidadMedida).Nombre;
                    }
                    grdProductos.DataSource = lstProductos;
                    string[] claves = { "idProducto" };
                    grdProductos.DataKeyNames = claves;
                    grdProductos.DataBind();
                }
                else
                {
                    grdProductos.DataSource = null;
                    grdProductos.DataBind();
                    lblError.Text = "La lista de productos no estaba llena";
                }
            }
            catch (Exception ex)
            {
                lblMensajeError.Text = ex.Message;
            }
        }
    }
}